package cn.supermarket.utils;

import cn.supermarket.web.State;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Repository;

import java.util.List;


/**
 * 自定义认证框架数据封装
 */
@Data
@ApiModel(value="自定义认证框架数据封装")
@Repository
public class GetInfoUtils {


    /**
     * 用户id 可以是admin用户也可以是普通user用户id
     */
    @ApiModelProperty(value="用户id")
    private Long id;
    @ApiModelProperty(value="用户名")
    private String username;
    @ApiModelProperty(value="用户类型")
    private String userType;
    @ApiModelProperty(value="用户权限列表")
    private List<String> authorities;

    //由于多个业务需要获得用户信息，所以单独编写一个方法，
    // 这个方法是springSecurity提供的登录用户的容器
    //方法的目的是获得springSecurity用户容器，从容器中获得用户信息
    public GetInfoUtils getUserInfo() throws SecurityException {
        UsernamePasswordAuthenticationToken authenticationToken =
                (UsernamePasswordAuthenticationToken) SecurityContextHolder
                        .getContext().getAuthentication();
        //判断获取的容器信息是否为空
        if (authenticationToken != null) {
            //如果不为空，则获取信息并返回
            GetInfoUtils info = (GetInfoUtils) authenticationToken.getCredentials();
            return info;
        } else {
            throw new SecurityException("没有登录账户");
        }
        //业务逻辑层中大多数业务只需要获取用户id，所以再定义一个获取id的方法
    }

}
